package com.xbongbong.pro.enums;

import com.xbongbong.i18n.util.I18nMessageUtil;
import java.util.ArrayList;
import java.util.List;
import lombok.Getter;

/**
 * 时间筛选相关---从SAAS移入
 * @author zcp
 * @version v1.0
 * @date 2019/2/15 15:26
 * @since v1.0
 */
@Getter
public enum TimeTypeEnum {
	//----------几个大类通过前端传来（timeType）
	//----------前四种：YEAR和SEASON可以切换图标显示12个月或4个月

	/**
	 * 年度筛选(即全年)，哪一年。可切分成12个月，根据year的值判断是哪一年，本年的筛选有5全年、51上半年(YEAR_HALF_UP)、52下半年(YEAR_HALF_DOWN)
	 */
	YEAR(5, "enum.timeType.name.year", "year"),
	/**
	 * 上半年，可切分成6个月，根据year的值判断是哪一年
	 */
	YEAR_HALF_UP(51, "enum.timeType.name.year_half_up", "yearHalfUp"),
	/**
	 * 下半年，可切分成6个月，根据year的值判断是哪一年
	 */
	YEAR_HALF_DOWN(52, "enum.timeType.name.year_half_down", "yearHalfDown"),
	/**
	 * 季度筛选，可切分成4个月，根据season的值判断是哪一季，不传or=0为本季；与year结合，则获取某年某季（但本质还是按季筛选）
	 */
	SEASON(4, "enum.timeType.name.season", "season"),
	/**
	 * 下一季度
	 */
	SEASON_NEXT(41, "enum.timeType.name.season_next", "seasonNext"),

	//----------下面四个只切换某些图标(比如排名的图标)、或排名信息、或pk榜时才会有

	/**
	 * 月度筛选，根据month的值判断是哪一月，不传or=0为本月；与year结合，则获取某年某月（但本质还是按月筛选）
	 */
	MONTH(3, "enum.timeType.name.month", "month"),
	/**
	 * 上月
	 */
	MONTH_LAST(30, "enum.timeType.name.month_last", "lastMonth"),
	/**
	 * 下月
	 */
	MONTH_NEXT(31, "enum.timeType.name.month_next", "monthNext"),
	/**
	 * 本周
	 */
	WEEK(2, "enum.timeType.name.week", "week"),
	/**
	 * 上周
	 */
	WEEK_LAST(20, "enum.timeType.name.week_last", "lastWeek"),
	/**
	 * 今日，结合day参数，代表某月的第day日
	 */
	DAY(1, "enum.timeType.name.day", "day"),
	/**
	 * 昨日
	 */
	DAY_LAST(10, "enum.timeType.name.day_last", "lastDay"),

	/**
	 * 自定义筛选，可自定义选择开始时间，结束时间（startTime，endTime）
	 */
	CUSTOM(6, "enum.timeType.name.custom", "custom"),
    /**
     * 自定义动态，可自定义选择开始时间，结束时间（startTime，endTime）eg:以前1天  未来1一天
     */
    DYNAMIC(7, "enum.timeType.name.dynamic", "dynamic"),
    /**
     * 至今
     */
    UP_TO_NOW(8, "enum.timeType.name.uptonow", "upToNow"),
	;

	/** 枚举值 -- */
	private final int		code;

	/** 枚举信息--中文名称 */
	private final String    name;

	/** 枚举描述 --英文名称*/
	private final String	alias;

	/**
	 * 构造一个<code>SubModuleEnum</code>枚举对象
	 *
	 * @param code
	 * @param name
	 * @param alias
	 */
	TimeTypeEnum(int code, String name,String alias) {
		this.code = code;
		this.name = name;
		this.alias = alias;
	}

	/**
	 * 根据时间格式获取符合的常用类型枚举 --- 只是适用于副指标图的动态筛选操作
	 *
	 * @param format 格式化信息
	 * @return 枚举类型 List<NormalTypeEnum>
	 */
	public static List<TimeTypeEnum> getByFormatStr(String format) {
		List<TimeTypeEnum> list = new ArrayList<>();
		IntervalTypeEnum intervalTypeEnum = IntervalTypeEnum.getByFormatStr(format);
		switch (intervalTypeEnum){
			case YEAR_QUARTER:
				list.add(SEASON);
				break;
			case YEAR_MONTH:
				list.add(MONTH_LAST);
				list.add(MONTH);
				break;
			case YEAR_WEEK:
				list.add(WEEK_LAST);
				list.add(WEEK);
				break;
			case YEAR_MONTH_DAY:
				list.add(DAY_LAST);
				list.add(DAY);
				break;
			default:
				break;
		}
		return list;
	}

	/**
	 * 通过枚举<code>alias</code>获得枚举
	 *
	 * @param alias
	 * @return WxErrorCodeEnum
	 */
	public static TimeTypeEnum getByAlias(String alias) {
		for (TimeTypeEnum cacheCode : values()) {
			if (cacheCode.getAlias().equals(alias)) {
				return cacheCode;
			}
		}
		return null;
	}

	/**
	 * 通过枚举<code>code</code>获得枚举
	 *
	 * @param code
	 * @return TimeTypeEnum
	 */
	public static TimeTypeEnum getByCode(Integer code) {
		if(code == null) {
			return null;
		}
		for (TimeTypeEnum cacheCode : values()) {
			if (code.equals(cacheCode.getCode())) {
				return cacheCode;
			}
		}
		return null;
	}

	/**
	 * 获取全部枚举
	 *
	 * @return List<TimeTypeEnum>
	 */
	public List<TimeTypeEnum> getAllEnum() {
		List<TimeTypeEnum> list = new ArrayList<TimeTypeEnum>();
		for (TimeTypeEnum cache : values()) {
			list.add(cache);
		}
		return list;
	}

	/**
	 * 获取全部枚举值
	 *
	 * @return List<String>
	 */
	public List<String> getAllEnumAlis() {
		List<String> list = new ArrayList<String>();
		for (TimeTypeEnum cache : values()) {
			list.add(cache.getAlias());
		}
		return list;
	}

	/**
	 * 从app首页进入下页统计页时，把首页的时间条件（本月、上月、本周、上周、今日、昨日）带入下一页回显用
	 * @param code
	 * @param defaultName
	 * @return
	 * @author cp.zhang
	 * @time 2016-10-18 下午7:26:02
	 */
	public static String getNameByCode(Integer code, String defaultName) {
		for (TimeTypeEnum cacheCode : values()) {
			if (code.equals(cacheCode.getCode())) {
				defaultName = cacheCode.getName();
			}
		}
		return defaultName;
	}

	public String getName() {
		return I18nMessageUtil.getMessage(name);
	}
}
